import axios from 'axios'
// import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import router from '@/router'
import { getTimeStamp } from '@/utils/auth'
import { Message } from 'element-ui'
const timeout = 60 * 60 * 1000
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  async config => {
    // do something before request is sent

    if (store.getters.token && !config.headers.Authorization) {
      // let each request carry token
      // ['X-Token'] is a custom headers key
      // please modify it according to the actual situation
      // 以上判断出是有有 token
    // 现在要多加一个处理逻辑,判断是否过期
    // 会封装一个函数检查是否过期, 如果返回 true 则是过期, 否则一切正常
      if (checkTimeout()) {
      // 过期
      // 1. 执行退出逻辑清理数据
        await store.dispatch('user/logout')
        // 2. 跳转到登录页
        router.push('/login')
        // 3. 拦截住剩下的请求
        Message.error('token 已超时')
        return Promise.reject('token 已超时')
      } else {
        config.headers.Authorization = `Bearer ${store.getters.token}`
      }
    }
    return config
  },
  error => {
    // do something with request error
    console.log('请求失败') // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  res => {
    // 解构 res 得到 success / data / message
    const { message, data, success } = res.data
    if (success) {
      // 如果 success 为真, 正常返回
      // 另外 因为成功与否已经做过判断
      // 所以这里可以考虑把data数据的外壳给解构掉
      // 直接将最核心的数据响应会到调用代码中即可
      return data
    } else {
      // 这里没有this 单独引入错误提示组件
      // this.$message.error('错啦!')
      Message.error(message || '系统错误')
      // 否则提示错误
      // reject
      return Promise.reject(new Error(message))
      // 这里 reject 是为了使用的时候继续可以链式调用
    }
  }, async err => {
    // 之前仅仅只是显示错误和返回reject
    // 这是一个通用逻辑, 所有错误都能这么干
    if (err.response && err.response.data && err.response.data.code === 10002) {
      // 有一种特殊情况, 如果 code === 10002
      // 那么就是 token 错误, 应该执行登出逻辑
      await store.dispatch('user/logout')
      router.push('/login')
      Message.error('登录失效')
    } else {
      console.dir(err)
      // 提示错误
      Message.error(err.message)
    }
    return Promise.reject(err)
  })

export default service

const checkTimeout = () => {
  const loginTimeStamp = getTimeStamp()
  const nowTimeStamp = Date.now()
  return nowTimeStamp - loginTimeStamp > timeout
}
